#ifndef DTU_NETWORK_H
#define DTU_NETWORK_H

#include "dtu_common.h"

/* 网络接口信息结构 */
typedef struct {
    network_type_t type;       /* 网络类型 */
    network_status_t status;   /* 网络状态 */
    char interface_name[32];   /* 接口名称 */
    char ip_address[16];       /* IP地址 */
    char netmask[16];         /* 子网掩码 */
    char gateway[16];         /* 网关 */
    char dns1[16];            /* 主DNS */
    char dns2[16];            /* 备DNS */
    int signal_strength;      /* 信号强度(WiFi/4G) */
    uint64_t bytes_sent;      /* 发送字节数 */
    uint64_t bytes_received;  /* 接收字节数 */
    time_t connect_time;      /* 连接时间 */
    time_t last_activity;     /* 最后活动时间 */
} network_interface_t;

/* 网络管理器结构 */
typedef struct {
    network_interface_t interfaces[3]; /* 网络接口数组 */
    int active_interface;     /* 当前活动接口索引 */
    dtu_model_t device_model; /* 设备型号 */
    pthread_mutex_t mutex;    /* 互斥锁 */
    pthread_t monitor_thread; /* 监控线程 */
    bool initialized;         /* 初始化标志 */
    bool monitor_running;     /* 监控线程运行标志 */
    bool running;             /* 网络管理器运行标志 */
    int monitor_interval;     /* 监控间隔(秒) */
} network_manager_t;

/* 网络事件类型 */
typedef enum {
    NETWORK_EVENT_CONNECTED = 0,
    NETWORK_EVENT_DISCONNECTED = 1,
    NETWORK_EVENT_IP_CHANGED = 2,
    NETWORK_EVENT_SIGNAL_CHANGED = 3,
    NETWORK_EVENT_ERROR = 4
} network_event_type_t;

/* 网络事件结构 */
typedef struct {
    network_event_type_t type; /* 事件类型 */
    network_type_t network_type; /* 网络类型 */
    char message[256];        /* 事件消息 */
    time_t timestamp;         /* 事件时间戳 */
} network_event_t;

/* 网络事件回调函数类型 */
typedef void (*network_event_callback_t)(const network_event_t* event, void* user_data);

/* 函数声明 */

/**
 * @brief 初始化网络管理器
 * @param device_model 设备型号
 * @return DTU_OK 成功，其他值失败
 */
dtu_error_t dtu_network_init(dtu_model_t device_model);

/**
 * @brief 销毁网络管理器
 */
void dtu_network_cleanup(void);

/**
 * @brief 启动网络监控
 * @return DTU_OK 成功，其他值失败
 */
dtu_error_t dtu_network_start_monitor(void);

/**
 * @brief 停止网络监控
 */
void dtu_network_stop_monitor(void);

/**
 * @brief 配置以太网接口
 * @param config 网络配置
 * @return DTU_OK 成功，其他值失败
 */
dtu_error_t dtu_network_config_ethernet(const network_config_t* config);

/**
 * @brief 配置WiFi接口
 * @param network_config 网络配置
 * @param wifi_config WiFi配置
 * @return DTU_OK 成功，其他值失败
 */
dtu_error_t dtu_network_config_wifi(const network_config_t* network_config,
                                    const wifi_config_t* wifi_config);

/**
 * @brief 配置4G接口
 * @param network_config 网络配置
 * @param lte_config 4G配置
 * @return DTU_OK 成功，其他值失败
 */
dtu_error_t dtu_network_config_lte(const network_config_t* network_config,
                                   const lte_config_t* lte_config);

/**
 * @brief 连接指定网络接口
 * @param type 网络类型
 * @return DTU_OK 成功，其他值失败
 */
dtu_error_t dtu_network_connect(network_type_t type);

/**
 * @brief 断开指定网络接口
 * @param type 网络类型
 * @return DTU_OK 成功，其他值失败
 */
dtu_error_t dtu_network_disconnect(network_type_t type);

/**
 * @brief 重新连接指定网络接口
 * @param type 网络类型
 * @return DTU_OK 成功，其他值失败
 */
dtu_error_t dtu_network_reconnect(network_type_t type);

/**
 * @brief 获取网络接口信息
 * @param type 网络类型
 * @param interface 输出接口信息
 * @return DTU_OK 成功，其他值失败
 */
dtu_error_t dtu_network_get_interface(network_type_t type, network_interface_t* interface);

/**
 * @brief 获取所有网络接口信息
 * @param interfaces 输出接口信息数组
 * @param count 数组大小
 * @return 实际接口数量
 */
int dtu_network_get_all_interfaces(network_interface_t* interfaces, int count);

/**
 * @brief 获取当前活动网络接口
 * @return 网络类型，失败返回-1
 */
network_type_t dtu_network_get_active_interface(void);

/**
 * @brief 设置活动网络接口
 * @param type 网络类型
 * @return DTU_OK 成功，其他值失败
 */
dtu_error_t dtu_network_set_active_interface(network_type_t type);

/**
 * @brief 检查网络连接状态
 * @param type 网络类型
 * @return 网络状态
 */
network_status_t dtu_network_check_status(network_type_t type);

/**
 * @brief 检查网络连通性
 * @param type 网络类型
 * @param host 测试主机地址
 * @param timeout 超时时间(秒)
 * @return true 连通，false 不连通
 */
bool dtu_network_check_connectivity(network_type_t type, const char* host, int timeout);

/**
 * @brief 获取网络统计信息
 * @param type 网络类型
 * @param bytes_sent 输出发送字节数
 * @param bytes_received 输出接收字节数
 * @return DTU_OK 成功，其他值失败
 */
dtu_error_t dtu_network_get_stats(network_type_t type, uint64_t* bytes_sent, uint64_t* bytes_received);

/**
 * @brief 重置网络统计信息
 * @param type 网络类型
 * @return DTU_OK 成功，其他值失败
 */
dtu_error_t dtu_network_reset_stats(network_type_t type);

/**
 * @brief 扫描WiFi网络
 * @param ssids 输出SSID数组
 * @param max_count 最大SSID数量
 * @return 实际SSID数量
 */
int dtu_network_scan_wifi(char ssids[][64], int max_count);

/**
 * @brief 获取WiFi信号强度
 * @return 信号强度(dBm)，失败返回0
 */
int dtu_network_get_wifi_signal_strength(void);

/**
 * @brief 获取4G信号强度
 * @return 信号强度(dBm)，失败返回0
 */
int dtu_network_get_lte_signal_strength(void);

/**
 * @brief 获取4G网络信息
 * @param operator_name 输出运营商名称
 * @param size 缓冲区大小
 * @return DTU_OK 成功，其他值失败
 */
dtu_error_t dtu_network_get_lte_operator(char* operator_name, size_t size);

/**
 * @brief 注册网络事件回调
 * @param callback 回调函数
 * @param user_data 用户数据
 * @return DTU_OK 成功，其他值失败
 */
dtu_error_t dtu_network_register_event_callback(network_event_callback_t callback, void* user_data);

/**
 * @brief 注销网络事件回调
 * @return DTU_OK 成功，其他值失败
 */
dtu_error_t dtu_network_unregister_event_callback(void);

/**
 * @brief 设置网络监控间隔
 * @param interval 监控间隔(秒)
 * @return DTU_OK 成功，其他值失败
 */
dtu_error_t dtu_network_set_monitor_interval(int interval);

/**
 * @brief 获取网络监控间隔
 * @return 监控间隔(秒)
 */
int dtu_network_get_monitor_interval(void);

/**
 * @brief 执行网络诊断
 * @param type 网络类型
 * @param result 输出诊断结果
 * @param size 缓冲区大小
 * @return DTU_OK 成功，其他值失败
 */
dtu_error_t dtu_network_diagnose(network_type_t type, char* result, size_t size);

/**
 * @brief 重启网络接口
 * @param type 网络类型
 * @return DTU_OK 成功，其他值失败
 */
dtu_error_t dtu_network_restart_interface(network_type_t type);

#endif /* DTU_NETWORK_H */
